package com.tjbklx1.pattern.pool.demo2;

import java.util.Iterator;
import java.util.Vector;

public abstract class ObjectPool<T> {

	private Vector<T> locked, unlocked; // locked是已占用的对象集合，unlocked是可用对象集合

	public ObjectPool() {
		locked = new Vector<T>();
		unlocked = new Vector<T>();
	}

	// 创建对象
	protected abstract T create();

	// 验证对象有效性
	public abstract boolean validate(T o);

	// 使对象失效
	public abstract void expire(T o);

	// 检出：从对象池获取对象
	public synchronized T checkOut() {
		T t;
		if (unlocked.size() > 0) {
			Iterator<T> iter = unlocked.iterator();
			while (iter.hasNext()) {
				t = iter.next();
				if (validate(t)) { // 对象有效
					unlocked.remove(t);
					locked.add(t);

					return t;
				} else { // 对象已经失效
					unlocked.remove(t);
					expire(t);
				}
			}
		}

		// 对象池塘没有可用对象，创建新对象
		t = create();
		locked.add(t);

		return (t);
	}

	// 检入：释放对象回对象池
	public synchronized void checkIn(T t) {
		locked.remove(t);
		if (validate(t)) { // 如果对象仍有效则放回可用对象集合中
			unlocked.add(t);
		} else { // 否则使对象失效
			expire(t);
		}
	}

}